package estadistec.logica.parser;

import estadistec.logica.tipos.*;

public final class Funciones
{

	static public void evaluar(EstructuraEvaluable evaluable)
	{
		Integer iPrimero, iSegundo;
		String sPrimero, sSegundo, sResultado;
		Float fPrimero, fSegundo;
		Boolean bPrimero, bSegundo;
		Number nPrimero, nSegundo, nResultado;
		switch(evaluable.getIdFuncion())
		{
			case 1:
				//ENTERO + ENTERO = ENTERO
				iPrimero = (Integer)evaluable.getPrimerParametro().getValor();
				iSegundo = (Integer)evaluable.getSegundoParametro().getValor();System.out.println("\t\t\t\t"+iPrimero + " " +iSegundo);
				evaluable.setValor(iPrimero + iSegundo);
				evaluable.setTipo(DataObjectTipos.ENTERO);
				break;
			case 2:	//CUALITATIVO + ENTERO = CUALITATIVO
			case 5: //CUALITATIVO + FLOTANTE = CUALITATIVO
			case 6: //CUALITATIVO + CUALITATIVO = CUALITATIVO
			case 7: //CUALITATIVO + RANGO = CUALITATIVO
				sResultado = evaluable.getPrimerParametro().getValor().toString()
						+ evaluable.getSegundoParametro().getValor().toString();
				evaluable.setValor(sResultado);
				evaluable.setTipo(DataObjectTipos.CUALITATIVO);
				break;
			case 3:
				//ENTERO + FLOTANTE = FLOTANTE
				nPrimero = (Number) evaluable.getPrimerParametro().getValor();
				nSegundo = (Number) evaluable.getSegundoParametro().getValor();
				evaluable.setValor(nPrimero.floatValue() + nSegundo.floatValue());
				evaluable.setTipo(DataObjectTipos.FLOTANTE);
				break;
			case 4:
				//FLOTANTE + FLOTANTE = FLOTANTE
				fPrimero = (Float) evaluable.getPrimerParametro().getValor();;
				fSegundo = (Float) evaluable.getSegundoParametro().getValor();
				evaluable.setValor(fPrimero + fSegundo);
				evaluable.setTipo(DataObjectTipos.FLOTANTE);
				break;
			//case 5,6,7 ver case2
			//case 8:
				//RANGO + RANGO = RANGO
				//falta definir la suma entre estadistec.logica.tipos.Intervalo
			case 9:
				//ENTERO - ENTERO = ENTERO 
				iPrimero = (Integer)evaluable.getPrimerParametro().getValor();
				iSegundo = ((Number)evaluable.getSegundoParametro().getValor()).intValue();
				evaluable.setValor(iPrimero - iSegundo);
				evaluable.setTipo(DataObjectTipos.ENTERO);
				break;
			case 10:
				//FLOTANTE - ENTERO = FLOTANTE
				nPrimero = (Number) evaluable.getPrimerParametro().getValor();
				nSegundo = (Number) evaluable.getSegundoParametro().getValor();
				evaluable.setValor(nPrimero.floatValue() - nSegundo.floatValue());
				evaluable.setTipo(DataObjectTipos.FLOTANTE);
				break;
			case 11:
				//FLOTANTE - FLOTANTE = FLOTANTE
				fPrimero = (Float) evaluable.getPrimerParametro().getValor();;
				fSegundo = (Float) evaluable.getSegundoParametro().getValor();
				evaluable.setValor(fPrimero - fSegundo);
				evaluable.setTipo(DataObjectTipos.FLOTANTE);
				break;
			//case 12:
				//RANGO - RANGO = RANGO
				//falta definir la resta entre estadistec.logica.tipos.Intervalo
			case 13:
				// ENTERO / ENTERO = FLOTANTE
			case 14:
				//ENTERO / FLOTANTE = FLOTANTE
			case 15:
				//FLOTANTE / FLOTANTE = FLOTANTE
				nPrimero = (Number) evaluable.getPrimerParametro().getValor();
				nSegundo = (Number) evaluable.getSegundoParametro().getValor();
				evaluable.setValor(nPrimero.floatValue() / nSegundo.floatValue());
				evaluable.setTipo(DataObjectTipos.FLOTANTE);
				break;
			case 16:
				//ENTERO ** ENTERO = ENTERO
			case 17:
				//FLOTANTE ** ENTERO = FLOTANTE
			case 18: 
				//FLOTANTE ** FLOTANTE = FLOTANTE
				nPrimero = (Number) evaluable.getPrimerParametro().getValor();
				nSegundo = (Number) evaluable.getSegundoParametro().getValor();
				evaluable.setValor(Math.pow(nPrimero.doubleValue(), nSegundo.doubleValue()));
				if(evaluable.getIdFuncion()==16)
				{
					evaluable.setTipo(DataObjectTipos.ENTERO);
					break;
				}
				evaluable.setTipo(DataObjectTipos.FLOTANTE);
				break;
			case 19:
				// ENTERO // ENTERO = ENTERO 
			case 20:
				// ENTERO // FLOTANTE = ENTERO
			case 21:
				// FLOTANTE // FLOTANTE = ENTERO
				nPrimero = (Number) evaluable.getPrimerParametro().getValor();
				nSegundo = (Number) evaluable.getSegundoParametro().getValor();
				nResultado = (Number) (nPrimero.floatValue() / nSegundo.floatValue());
				evaluable.setValor(nResultado.intValue());
				evaluable.setTipo(DataObjectTipos.ENTERO);
				break;
			case 22:
				//ENTERO * ENTERO = ENTERO
			case 23:
				//FLOTANTE * ENTERO = FLOTANTE
			case 24:
				//FLOTANTE * FLOTANTE = FLOTANTE
				nPrimero = (Number) evaluable.getPrimerParametro().getValor();
				nSegundo = (Number) evaluable.getSegundoParametro().getValor();
				evaluable.setValor( nPrimero.floatValue() * nSegundo.floatValue() );
				if(evaluable.getIdFuncion()==22)
				{
					evaluable.setTipo(DataObjectTipos.ENTERO);
					break;
				}
				evaluable.setTipo(DataObjectTipos.FLOTANTE);
				break;
			case 25:
				//ENTERO % ENTERO = ENTERO 
			case 26:
				//FLOTANTE % ENTERO = FLOTANTE 
			case 27:
				//FLOTANTE % FLOTANTE = FLOTANTE
				nPrimero = (Number) evaluable.getPrimerParametro().getValor();
				nSegundo = (Number) evaluable.getSegundoParametro().getValor();
				evaluable.setValor( nPrimero.floatValue() % nSegundo.floatValue() );
				if(evaluable.getIdFuncion()==25)
				{
					evaluable.setTipo(DataObjectTipos.ENTERO);
					break;
				}
				evaluable.setTipo(DataObjectTipos.FLOTANTE);
				break;
			case 28:
				//ENTERO < ENTERO = BOOL
			case 29:
				//ENTERO < FLOTANTE = BOOL
			case 30:
				//FLOTANTE < FLOTANTE = BOOL
				nPrimero = (Number) evaluable.getPrimerParametro().getValor();
				nSegundo = (Number) evaluable.getSegundoParametro().getValor();
				evaluable.setValor( nPrimero.floatValue() < nSegundo.floatValue() );
				evaluable.setTipo(DataObjectTipos.BOOL);
				break;
			case 31:
				//ENTERO > ENTERO = BOOL
			case 32:
				//ENTERO > FLOTANTE = BOOL
			case 33:
				//FLOTANTE > FLOTANTE = BOOL
				nPrimero = (Number) evaluable.getPrimerParametro().getValor();
				nSegundo = (Number) evaluable.getSegundoParametro().getValor();
				evaluable.setValor( nPrimero.floatValue() > nSegundo.floatValue() );
				evaluable.setTipo(DataObjectTipos.BOOL);
				break;
			case 34:
				//ENTERO <= ENTERO = BOOL
			case 35:
				//ENTERO <= FLOTANTE = BOOL
			case 36:
				//FLOTANTE <= FLOTANTE = BOOL
				nPrimero = (Number) evaluable.getPrimerParametro().getValor();
				nSegundo = (Number) evaluable.getSegundoParametro().getValor();
				evaluable.setValor( nPrimero.floatValue() <= nSegundo.floatValue() );
				evaluable.setTipo(DataObjectTipos.BOOL);
				break;
			case 37:
				//ENTERO >= ENTERO = BOOL
			case 38:
				//ENTERO >= FLOTANTE = BOOL
			case 39:
				//FLOTANTE >= FLOTANTE = BOOL
				nPrimero = (Number) evaluable.getPrimerParametro().getValor();
				nSegundo = (Number) evaluable.getSegundoParametro().getValor();
				evaluable.setValor( nPrimero.floatValue() >= nSegundo.floatValue() );
				evaluable.setTipo(DataObjectTipos.BOOL);
				break;
			case 40:
				//ENTERO /= ENTERO = BOOL
			case 41:
				//ENTERO /= FLOTANTE = BOOL
			case 42:
				//FLOTANTE /= FLOTANTE = BOOL
				nPrimero = (Number) evaluable.getPrimerParametro().getValor();
				nSegundo = (Number) evaluable.getSegundoParametro().getValor();
				evaluable.setValor( nPrimero.floatValue() != nSegundo.floatValue() );
				evaluable.setTipo(DataObjectTipos.BOOL);
				break;
			case 43:
				//BOOL /= BOOL = BOOL
				bPrimero = (Boolean) evaluable.getPrimerParametro().getValor();
				bSegundo = (Boolean) evaluable.getSegundoParametro().getValor();
				evaluable.setValor( bPrimero != bSegundo );
				evaluable.setTipo(DataObjectTipos.BOOL);
				break;
			case 44:
				//CUALITATIVO /= CUALITATIVO = BOOL
				sPrimero = (String) evaluable.getPrimerParametro().getValor();
				sSegundo = (String) evaluable.getSegundoParametro().getValor();
				evaluable.setValor( ! sPrimero.equals(sSegundo) );
				evaluable.setTipo(DataObjectTipos.BOOL);
				break;
			case 45:
				//ENTERO == ENTERO = BOOL
			case 46:
				//ENTERO == FLOTANTE = BOOL
			case 47:
				//FLOTANTE == FLOTANTE = BOOL
				nPrimero = (Number) evaluable.getPrimerParametro().getValor();
				nSegundo = (Number) evaluable.getSegundoParametro().getValor();
				evaluable.setValor( nPrimero.floatValue() == nSegundo.floatValue() );
				evaluable.setTipo(DataObjectTipos.BOOL);
				break;
			case 48:
				//BOOL == BOOL = BOOL
				bPrimero = (Boolean) evaluable.getPrimerParametro().getValor();
				bSegundo = (Boolean) evaluable.getSegundoParametro().getValor();
				evaluable.setValor( bPrimero == bSegundo );
				evaluable.setTipo(DataObjectTipos.BOOL);
				break;
			case 49:
				//CUALITATIVO == CUALITATIVO = BOOL
				sPrimero = (String) evaluable.getPrimerParametro().getValor();
				sSegundo = (String) evaluable.getSegundoParametro().getValor();
				evaluable.setValor( sPrimero.equals(sSegundo) );
				evaluable.setTipo(DataObjectTipos.BOOL);
				break;
			case 50:
				//no BOOL = BOOL
				bPrimero = (Boolean) evaluable.getPrimerParametro().getValor();
				evaluable.setValor(!bPrimero);
				evaluable.setTipo(DataObjectTipos.BOOL);
				break;
			case 51:
				//BOOL y BOOL = BOOL 
				bPrimero = (Boolean) evaluable.getPrimerParametro().getValor();
				bSegundo = (Boolean) evaluable.getSegundoParametro().getValor();
				evaluable.setValor(bPrimero && bSegundo);
				evaluable.setTipo(DataObjectTipos.BOOL);
				break;
			case 52:
				//BOOL o BOOL = BOOL 
				bPrimero = (Boolean) evaluable.getPrimerParametro().getValor();
				bSegundo = (Boolean) evaluable.getSegundoParametro().getValor();
				evaluable.setValor(bPrimero || bSegundo);
				evaluable.setTipo(DataObjectTipos.BOOL);
				break;
			case 65:
				//sen (ENTERO) = FLOTANTE
				iPrimero = (Integer) evaluable.getPrimerParametro().getValor();
				evaluable.setValor(Math.sin(iPrimero));
				evaluable.setTipo(DataObjectTipos.FLOTANTE);
				break;
			case 66:
				fPrimero = (Float) evaluable.getPrimerParametro().getValor();
				evaluable.setValor(Math.sin(fPrimero));
				evaluable.setTipo(DataObjectTipos.FLOTANTE);
				break;
			default :
				break;
		}
	}
}
